package main

import (
	"embed"
	"flag"
	"fmt"
	"os"
	"time"

	"log"

	"gitee.com/liumou_site/go-network-monitoring/api"
	"gitee.com/liumou_site/logger"
	"github.com/gin-gonic/gin"
)

const (
	Version     = "1.2.3"
	AppName     = "Go网络监控"
	Description = "一个现代化的多网卡实时网络流量监控工具"
)

var (
	StartTime = time.Now()

	//go:embed templates
	embeddedTemplates embed.FS
)

// server 函数初始化网络服务器，配置路由，并启动服务器监听指定端口。
func server(r *gin.Engine, hostname, address string, port int) {
	// 创建路由配置
	routeConfig := api.RouteConfig{
		Version:     Version,
		AppName:     AppName,
		Description: Description,
		StartTime:   StartTime,
	}

	// 注册所有路由
	api.RegisterRoutes(r, embeddedTemplates, routeConfig)

	// 启动服务器，监听指定地址和端口
	listenAddr := fmt.Sprintf("%s:%d", address, port)
	logger.Info("Server starting on", listenAddr)
	err := r.Run(listenAddr)
	if err != nil {
		logger.Fatal("Error running server:", err)
	}
	fmt.Printf("http://%s\n", listenAddr)
}

// main 函数是程序的入口点。
func main() {
	// 定义命令行参数
	var (
		address = flag.String("address", "0.0.0.0", "监听地址")
		port    = flag.Int("port", 8083, "监听端口")
	)
	// 自定义帮助信息
	flag.Usage = func() {
		fmt.Printf("%s v%s\n", AppName, Version)
		fmt.Printf("%s\n\n", Description)
		fmt.Println("使用方法:")
		fmt.Printf("  %s [选项]\n\n", os.Args[0])
		fmt.Println("选项:")
		flag.PrintDefaults()
		fmt.Println("\n示例:")
		fmt.Println("  ./network-monitor                    # 默认监听 0.0.0.0:8083")
		fmt.Println("  ./network-monitor -address 127.0.0.1 # 指定监听地址")
		fmt.Println("  ./network-monitor -port 8080         # 指定监听端口")
		fmt.Println("\n访问地址:")
		fmt.Println("  http://<address>:<port>              # Web界面")
		fmt.Println("  http://<address>:<port>/api/network  # 原始网络数据API")
		fmt.Println("  http://<address>:<port>/speed        # 格式化网卡数据API")
	}

	flag.Parse()

	// 获取主机名
	hostname, err := os.Hostname()
	if err != nil {
		logger.Fatal("获取主机名失败:", err)
	}

	// 打印嵌入的 templates 目录文件列表
	if entries, err := embeddedTemplates.ReadDir("templates"); err == nil {
		log.Println("templates 目录下的文件:")
		for _, e := range entries {
			log.Printf("  - %s (dir=%v)\n", e.Name(), e.IsDir())
		}
	} else {
		log.Printf("读取 templates 目录失败: %v", err)
	}

	// 启动HTTP服务器，不再需要获取默认网卡
	fmt.Printf("\n%s v%s 启动中...\n", AppName, Version)
	fmt.Printf("监听地址: %s:%d\n", *address, *port)
	fmt.Printf("访问地址: http://%s:%d\n\n", *address, *port)

	server(gin.Default(), hostname, *address, *port)
}
